Apache Maven 详解
全局配置文件settings.xml
文件位置
settings.xml文件一般存在于两个位置:
全局配置: ${M2_HOME}/conf/settings.xml
用户配置: ({user.home}/.m2/settings.xml note:用户配置优先于全局配置。){user.home} 和和所有其他系统属性只能在3.0+版本上使用。请注意windows和Linux使用变量的区别。
配置优先级
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
settings.xml
顶级元素介绍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository/> <interactiveMode/> <usePluginRegistry/> <offline/> <pluginGroups/> <servers/> <mirrors/> <proxies/> <profiles/> <activeProfiles/> </settings>
|
LocalRepository
作用:该值表示构建系统本地仓库的路径。
其默认值:~/.m2/repository。
1
| <localRepository>${user.home}/.m2/repository</localRepository>
|
InteractiveMode
作用:表示maven是否需要和用户交互以获得输入。
如果maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。
1
| <interactiveMode>true</interactiveMode>
|
UsePluginRegistry
作用:maven是否需要使用plugin-registry.xml文件来管理插件版本。
如果需要让maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。
1
| <usePluginRegistry>false</usePluginRegistry>
|
Offline
作用:表示maven是否需要在离线模式下运行。
如果构建系统需要在离线模式下运行,则为true,默认为false。
当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
1
| <offline>false</offline>
|
PluginGroups
作用:当插件的组织id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。
该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。
当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins
和org.codehaus.mojo
。
1 2 3 4 5 6 7 8 9 10
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <pluginGroups> <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> ... </settings>
|
Servers
作用:一般,仓库的下载和部署是在pom.xml文件中的repositories
和distributionManagement
元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在settings.xml
中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <servers> <server> <id>server001</id> <username>my_login</username> <password>my_password</password> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <passphrase>some_passphrase</passphrase> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> </server> </servers> ... </settings>
|
Mirrors
作用:为仓库列表配置的下载镜像列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <mirrors> <mirror> <id>planetmirror.com</id> <name>PlanetMirror Australia</name> <url>http://downloads.planetmirror.com/pub/maven2</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> ... </settings>
|
Proxies
作用:用来配置不同的代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <proxies> <proxy> <id>myproxy</id> <active>true</active> <protocol>http</protocol> <host>proxy.somewhere.com</host> <port>8080</port> <username>proxyuser</username> <password>somepassword</password> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> ... </settings>
|
Profiles
作用:根据环境参数来调整构建配置的列表。
settings.xml
中的profile
元素是pom.xml
中profile
元素的裁剪版本。
它包含了id
、activation
、repositories
、pluginRepositories
和 properties
元素。这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml
中的profile
被激活,它的值会覆盖任何其它定义在pom.xml
中带有相同id的profile
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <profiles> <profile> <id>test</id> <activation /> <properties /> <repositories /> <pluginRepositories /> </profile> </profiles> ... </settings>
|
Activation
作用:自动触发profile
的条件逻辑。
如pom.xml
中的profile
一样,profile
的作用在于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation
元素指定。
activation
元素并不是激活profile
的唯一方式。settings.xml
文件中的activeProfile
元素可以包含profile
的id
。profile
也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <activation> <activeByDefault>false</activeByDefault> <jdk>1.5</jdk> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> <property> <name>mavenVersion</name> <value>2.0.3</value> </property> <file> <exists>${basedir}/file2.properties</exists> <missing>${basedir}/file1.properties</missing> </file> </activation>
|
注:在maven工程的pom.xml所在目录下执行mvn help:active-profiles
命令可以查看中央仓储的profile是否在工程中生效。
properties
作用:对应profile
的扩展属性列表。
maven属性和ant中的属性一样,可以用来存放一些值。这些值可以在pom.xml
中的任何地方使用标记${X}
来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。
1 2 3 4 5 6 7 8 9 10
|
<properties> <user.install>${user.home}/our-project</user.install> </properties>
|
注:如果该profile被激活,则可以在pom.xml
中使用${user.install}。
Repositories
作用:远程仓库列表,它是maven用来填充构建系统本地仓库所使用的一组远程仓库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <repositories> <repository> <id>codehausSnapshots</id> <name>Codehaus Snapshots</name> <releases> <enabled>false</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <url>http://snapshots.maven.codehaus.org/maven2</url> <layout>default</layout> </repository> </repositories>
|
pluginRepositories
作用:发现插件的远程仓库列表。
和repository
类似,只是repository
是管理jar包依赖的仓库,pluginRepositories
则是管理插件的仓库。
maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories
元素的结构和repositories
元素的结构类似。每个pluginRepository
元素指定一个Maven可以用来寻找新插件的远程地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <pluginRepositories> <pluginRepository> <releases> <enabled/> <updatePolicy/> <checksumPolicy/> </releases> <snapshots> <enabled/> <updatePolicy/> <checksumPolicy/> </snapshots> <id/> <name/> <url/> <layout/> </pluginRepository> </pluginRepositories>
|
ActiveProfiles
作用:手动激活profiles的列表,按照profile
被应用的顺序定义activeProfile
。
该元素包含了一组activeProfile
元素,每个activeProfile
都含有一个profile id。任何在activeProfile
中定义的profile id,不论环境设置如何,其对应的 profile
都会被激活。如果没有匹配的profile
,则什么都不会发生。
例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。
1 2 3 4 5 6 7 8 9 10
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> ... <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles> ... </settings>
|
POM.XML
pom是什么
pom代表项目对象模型,它是Maven中工作的基本组成单位。它是一个XML文件,始终保存在项目的基本目录中的pom.xml文件中。pom包含的对象是使用maven来构建的,pom.xml文件包含了项目的各种配置信息。 创建一个POM之前,应该要先决定项目组(groupId),项目名(artifactId)和版本(version),因为这些属性在项目仓库是唯一标识的。需要特别注意,每个项目都只有一个pom.xml文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging>
<dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties>
<build>...</build> <reporting>...</reporting>
<name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors>
<issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <distributionManagement>...</distributionManagement> <profiles>...</profiles> </project>
|
基本配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company.bank</groupId> <artifactId>parent</artifactId> <version>1.0</version> <packaging>war</packaging> <project>
|
节点 |
解释说明 |
modelVersion |
pom模型版本,maven2和3只能为4.0.0 |
groupId |
这是项目组的编号,这在组织或项目中通常是独一无二的。 例如,一家银行集团com.company.bank拥有所有银行相关项目。 |
artifactId |
这是项目的ID。这通常是项目的名称。 例如,consumer-banking。 除了groupId之外,artifactId还定义了artifact在存储库中的位置。 |
version |
这是项目的版本。与groupId一起使用,artifact在存储库中用于将版本彼此分离。 例如:com.company.bank:consumer-banking:1.0,com.company.bank:consumer-banking:1.1 |
packaging |
项目打包方式,有以下值:pom, jar, maven-plugin, ejb, war, ear, rar, par |
依赖配置
dependencies
项目相关依赖配置,如果在父项目写的依赖,会被子项目引用。一般会在父项目中定义子项目中所有共用的依赖。
1 2 3 4 5 6 7
| <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
|
parent
用于确定父项目的坐标位置。
1 2 3 4 5 6
| <parent> <groupId>com.learnPro</groupId> <artifactId>SIP-parent</artifactId> <relativePath></relativePath> <version>0.0.1-SNAPSHOT</version> </parent>
|
groupId: 父项目的组Id标识符
artifactId:父项目的唯一标识符
relativePath:Maven首先在当前项目中找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。
version: 父项目的版本
modules
有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作。
1 2 3 4 5
| <modules> <module>com-a</> <module>com-b</> <module>com-c</> <modules/>
|
properties
用于定义pom常量
1 2 3
| <properties> <java.version>1.7</java.version> </properties>
|
上面这个常量可以在pom文件的任意地方通过${Java.version}来引用
dependencyManagement
配置写法同dependencies
1 2 3 4 5
| <dependencyManagement> <dependencies> ..... </dependencies> </dependencyManagement>
|
在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号,这样的好处是,父项目统一了版本,而且子项目可以在需要的时候才引用对应的依赖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 父项目: <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
子项目:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
|
构建配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| <build> <sourceDirectory/> <scriptSourceDirectory/> <testSourceDirectory/> <outputDirectory/> <testOutputDirectory/> <extensions> <extension> <groupId/> <artifactId/> <version/> </extension> </extensions> <defaultGoal/> <resources> <resource> <targetPath/> <filtering/> <directory/> <includes/> <excludes/> </resource> </resources> <testResources> <testResource> <targetPath/><filtering/><directory/><includes/><excludes/> </testResource> </testResources> <directory/> <finalName/> <filters/> <pluginManagement> <plugins> <plugin> <groupId/> <artifactId/> <version/> <extensions/> <executions> <execution> <id/> <phase/> <goals/> <inherited/> <configuration/> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <inherited/> <configuration/> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId/><artifactId/><version/><extensions/> <executions> <execution> <id/><phase/><goals/><inherited/><configuration/> </execution> </executions> <dependencies> <dependency> ...... </dependency> </dependencies> <goals/><inherited/><configuration/> </plugin> </plugins> </build>
|
reporting
该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <reporting> <excludeDefaults/> <outputDirectory/> <plugins> <plugin> <groupId/> <artifactId/> <version/> <inherited/> <configuration/> <reportSets> <reportSet> <id/> <configuration/> <inherited/> <reports/> </reportSet> </reportSets> </plugin> </plugins> </reporting>
|
项目信息
name:给用户提供更为友好的项目名
description:项目描述,maven文档中保存
url:主页的URL,maven文档中保存
inceptionYear:项目创建年份,4位数字。当产生版权信息时需要使用这个值
licenses:该元素描述了项目所有License列表。 应该只列出该项目的-
license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。(如下)
1 2 3 4 5 6 7 8 9 10
| <license> <name>...</name> <url>....</url> <distribution>repo</distribution> <comments>....</comments> </license>
|
- organization:1.name 组织名 2.url 组织主页url
- developers:项目开发人员列表(如下)
- contributors:项目其他贡献者列表,同developers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <developers> <developer> <id>....</id> <name>...</name> <email>...</email> <url>...<url/> <roles> <role>Java Dev</role> <role>Web UI</role> </roles> <organization>sun</organization> <organizationUrl>...</organizationUrl> <properties> </properties> <timezone>-5</timezone> </developer> </developers>
|
环境配置
issueManagement
目的问题管理系统(Bugzilla, Jira, Scarab)的名称和URL
1 2 3 4
| <issueManagement> <system>Bugzilla</system> <url>http://127.0.0.1/bugzilla/</url> </issueManagement>
|
ciManagement
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <ciManagement> <system>continuum</system> <url>http://127.0.0.1:8080/continuum</url> <notifiers> <notifier> <type>mail</type> <sendOnError>true</sendOnError> <sendOnFailure>true</sendOnFailure> <sendOnSuccess>false</sendOnSuccess> <sendOnWarning>false</sendOnWarning> <address>continuum@127.0.0.1</address> <configuration></configuration> </notifier> </notifiers> </ciManagement>
|
- system:持续集成系统的名字
- url:持续集成系统的URL
- notifiers:构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)
type:通知方式
sendOnError:错误时是否通知
sendOnFailure:失败时是否通知
sendOnSuccess:成功时是否通知
sendOnWarning:警告时是否通知
address:通知发送到的地址
configuration:扩展项
mailingLists
项目相关邮件列表信息
1 2 3 4 5 6 7 8 9 10 11 12 13
| <mailingLists> <mailingList> <name>User List</name> <subscribe>user-subscribe@127.0.0.1</subscribe> <unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe> <post>user@127.0.0.1</post> <archive>http://127.0.0.1/user/</archive> <otherArchives> <otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive> </otherArchives> </mailingList> ..... </mailingLists>
|
- subscribe, unsubscribe: 订阅邮件(取消订阅)的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建
- archive:浏览邮件信息的URL
- post:接收邮件的地址
scm
许你配置你的代码库,供Maven web站点和其它插件使用
1 2 3 4 5 6
| <scm> <connection>scm:svn:http://127.0.0.1/svn/my-project</connection> <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection> <tag>HEAD</tag> <url>http://127.0.0.1/websvn/my-project</url> </scm>
|
connection, developerConnection:这两个表示我们如何连接到maven的版本库。connection只提供读,developerConnection将提供写的请求
写法如:scm:[provider]:[provider_specific]
如果连接到CVS仓库,可以配置如下:-
scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
tag:项目标签,默认HEAD
url:共有仓库路径
prerequisites
项目构建的前提
1 2 3
| <prerequisites> <maven>2.0.6</maven> </prerequisites>
|
repositories,pluginRepositories
依赖和扩展的远程仓库列表,同上篇文章,setting.xml配置中介绍的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <repositories> <repository> <releases> <enabled>false</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> <id>codehausSnapshots</id> <name>Codehaus Snapshots</name> <url>http://snapshots.maven.codehaus.org/maven2</url> <layout>default</layout> </repository> </repositories> <pluginRepositories> ... </pluginRepositories>
|
releases, snapshots:这是各种构件的策略,release或者snapshot。这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。
enable:true或者false,决定仓库是否对于各自的类型激活(release 或者 snapshot)。
updatePolicy: 这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的. 有以下选择: always, daily (默认), interval:X (x是代表分钟的整型) , never.
checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignore,fail,warn,或者不正确的校验和。
layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2有它仓库默认布局。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy。
第一次更新于2020年6月22日
第二次更新于2020年6月23日